package com.hjn.json;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;

public class AnalyiseJsonJDK7_1 {
    public static void main(String[] args) throws IOException {
        String path = "E:\\study\\jcode\\son\\src\\main\\doc\\json.txt";
        File jsonFile = new File(path);
        StringBuffer jsonStr = new StringBuffer("");
        InputStream inputStream = new FileInputStream(jsonFile);
        int len = 0;
        byte array[] = new byte[1024];
        while ((len = inputStream.read(array)) != -1) {
            String s = new String(array, 0, len, "gbk");
            jsonStr.append(s);
        }
        inputStream.close();
        //将返回值转成jsonobject对象
        JSONArray jsonArray = JSONArray.parseArray(jsonStr.toString());
        JSONObject jsonObj = (JSONObject) jsonArray.get(0);

        //获取key的集合 例如step1_operator
        Set<String> keySet = jsonObj.keySet();
        //需要去除的键值对信息
        Set<String> excludeSet = new HashSet() {
            {
                add("record_id");
                add("citizen_id");
                add("area_code");
                add("service_code");
            }
        };
        //去除不需要的信息（头部信息）
        keySet.removeAll(excludeSet);

        //每个对象有6个属性 下面解析需要分多少组
        int length = keySet.size() / 6;
        //用来存储解析后的分组step信息
        Map<String, JSONObject> jsonMap = new HashMap<>();
        JSONObject json = null;
        for (int i = 0; i < length; i++) {
            String prefix = "step" + (i + 1);
            for (String key : keySet) {

                String value = (String) jsonObj.get(key);
                //从人员map中获取对象，如果当前人员不在map中，则创建，如若在，则获取
                json = jsonMap.get(prefix);
                /*
                    如果接口返回对象中的key值中包含了step1
                    则将接口获得的数据中的前缀为step1的信息在json对象中，
                    同时将json对象放入在jsonMap中
                        如果json在map中，则获取json对象，将属性添加到json中
                        如果没有，创建新的json对象，并且将属性添加到json中
                 */
                if (json == null) {
                    json = new JSONObject();
                    json.put("index", i);
                    jsonMap.put(prefix, json);
                }
                if (key.contains(prefix)) {
                    key = key.substring(key.indexOf("_") + 1);
                    json.put(key, value);
                }
            }
        }

        JSONArray result = new JSONArray();
        Set<Map.Entry<String, JSONObject>> entries = jsonMap.entrySet();
        for (Map.Entry<String, JSONObject> entry : entries) {
            result.add(entry.getValue());
        }
        sortJsonArray(result);

    }

    public static void sortJsonArray(JSONArray array){
        List<JSONObject> list = JSONArray.parseArray(array.toJSONString(), JSONObject.class);
        System.out.println("排序前："+array);
        Collections.sort(list, new Comparator<JSONObject>() {
            @Override
            public int compare(JSONObject o1, JSONObject o2) {
                int a = o1.getInteger("index");
                int b = o2.getInteger("index");
                if (a > b) {
                    return 1;
                } else if(a == b) {
                    return 0;
                } else {
                    return -1;
                }
            }
        });
        JSONArray jsonArray = JSONArray.parseArray(list.toString());
        System.out.println("排序后："+jsonArray);
    }
}
